<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>事件</title>
    <link rel="stylesheet" href="style.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
    <link rel="start" href="index.html" title="Clutter编程" />
    <link rel="up" href="sec-actors.html" title="Chapter 5. Actors" />
    <link rel="prev" href="sec-containers.html" title="容器" />
    <link rel="next" href="sec-timelines.html" title="Chapter 6. 时间线" />
  </head>
  <body>
    <div class="navheader">
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">事件</th>
        </tr>
        <tr>
          <td width="20%" align="left"><a accesskey="p" href="sec-containers.html"><img src="../icons/prev.png" alt="Prev" /></a> </td>
          <th width="60%" align="center">Chapter 5. Actors</th>
          <td width="20%" align="right"> <a accesskey="n" href="sec-timelines.html"><img src="../icons/next.png" alt="Next" /></a></td>
        </tr>
      </table>
      <hr />
    </div>
    <div class="sect1" lang="en" xml:lang="en">
      <div class="titlepage">
        <div>
          <div>
            <h2 class="title" style="clear: both"><a id="sec-actors-events"></a>事件</h2>
          </div>
        </div>
      </div>
      <p>
基类 <code class="classname">ClutterActor</code> 有几个信号，当用户与 actor 交互时信号会被发出：
</p>
      <div class="itemizedlist">
        <ul type="disc">
          <li>
            <p><code class="function">button-press-event</code>: 当在 actor 上按下鼠标时发出；</p>
          </li>
          <li>
            <p><code class="function">button-release-event</code>: 当在 actor 上释放鼠标时发出；</p>
          </li>
          <li>
            <p><code class="function">motion-event</code>: 当在 actor 上移动鼠标时发出；</p>
          </li>
          <li>
            <p><code class="function">enter-event</code>: 当鼠标移入 actor 区域时发出；</p>
          </li>
          <li>
            <p><code class="function">leave-event</code>: 当鼠标移出 actor 区域时发出。</p>
          </li>
        </ul>
      </div>
      <p>
</p>
      <p>例如，可以这样检测在一个 actor 上点击了鼠标：
</p>
      <pre class="programlisting">
g_signal_connect (rect, "button-press-event", G_CALLBACK (on_rect_button_press), NULL);
</pre>
      <p>
</p>
      <p>
另外，也可以仅仅处理来自 parent <code class="classname">ClutterStage</code> 的信号，然后用 <code class="function">clutter_stage_get_actor_at_pos()</code> 找出信号来源于哪个 actor。
</p>
      <p>
然而，从性能优化上考虑， <span class="application">Clutter</span> 默认状态下不会发送所有的事件信号。例如，要收到 actor 的事件信号，而不仅仅是 stage，必须调用 <code class="function">clutter_actor_set_reactive()</code>。
如果不需要 motion 事件信号 (<code class="literal">motion-event</code>, <code class="literal">enter-event</code> 和 <code class="literal">leave-event</code>)，可以调用 <code class="function"> clutter_set_motion_events_enabled(FALSE)</code> 函数来进一步优化性能。
</p>
      <p>
若你的信号事件处理函数对事件进行了全部处理，应该返回 <code class="literal">true</code>；否则，若你想要事件信号被转发到事件链上的下一个 actor，让事件处理函数返回 <code class="literal">false</code> 。 通过捕获事件信号 (captured-event signal)，<span class="application">Clutter</span> 首先让 stage 处理每个事件。 若 stage 不处理这些事件，那么事件会被传递给 child actor；事件首先被传递给 actor 的 container，若 container 仍然不对出事件进行处理，那么事件将会以特殊信号 (比如 <code class="literal">button-press-event</code> 或者 <code class="literal">key-press-event</code>) 的方式发送。这些特殊信号首先由 child actor 发出，然后是它的 parent，其次是 stage，除非有信号处理函数对信号进行处理并返回 <code class="literal">true</code>。
</p>
      <p>
当 actor 有按键焦点时，它通常只收到键盘事件。你也可以让某个 actor 独占事件，这需
要使用 <code class="function">clutter_grab_pointer</code> 或者 <code class="function">clutter_grab_keyboard</code> 来截获事件。
</p>
      <div class="sect2" lang="en" xml:lang="en">
        <div class="titlepage">
          <div>
            <div>
              <h3 class="title"><a id="actor-example-events"></a>示例</h3>
            </div>
          </div>
        </div>
        <p>
下面的例子展示了处理一个 actor 的鼠标点击事件：
</p>
        <div class="figure">
          <a id="figure-actor-events"></a>
          <p class="title">
            <b>Figure 5.4. Actor Events</b>
          </p>
          <div class="figure-contents">
            <div class="screenshot">
              <div>
                <img src="./figures/actor_events.png" alt="Actor Events" />
              </div>
            </div>
          </div>
        </div>
        <br class="figure-break" />
        <p>
          <a class="ulink" href="./examples/actor_events" target="_top">Source Code</a>
        </p>
      </div>
    </div>
    <div class="navfooter">
      <hr />
      <table width="100%" summary="Navigation footer">
        <tr>
          <td width="40%" align="left"><a accesskey="p" href="sec-containers.html"><img src="../icons/prev.png" alt="Prev" /></a> </td>
          <td width="20%" align="center">
            <a accesskey="u" href="sec-actors.html">
              <img src="../icons/up.png" alt="Up" />
            </a>
          </td>
          <td width="40%" align="right"> <a accesskey="n" href="sec-timelines.html"><img src="../icons/next.png" alt="Next" /></a></td>
        </tr>
        <tr>
          <td width="40%" align="left" valign="top">容器 </td>
          <td width="20%" align="center">
            <a accesskey="h" href="index.html">
              <img src="../icons/home.png" alt="Home" />
            </a>
          </td>
          <td width="40%" align="right" valign="top"> Chapter 6. 时间线</td>
        </tr>
      </table>
    </div>
  </body>
</html>
